package 进阶阶段;

import java.util.ArrayList;
import java.util.Collection;

public class demo08泛型 {
    public static void main(String[] args) {
        //泛型：用来灵活地将数据类型应用到不同的类、方法、接口当中。将数据类型作为参数进行传递
        //ArrayList<String> list = new ArrayList<String>();//使用泛型<String>,确定泛型为String类型
        //当使用Iterator<String>控制元素类型后，就不需要强转了。获取到的元素直接就是String类型
        ArrayList<String> arrayList = new ArrayList();
        arrayList.add("宋祖儿");
        arrayList.add("关晓彤");
        arrayList.add("徐娇");

        Man man = new Man();
        man.setWeiZhi("设置weizhi");
        System.out.println(man.getWeiZhi());

        Man<Integer> man1 = new Man<>();
        man1.setWeiZhi(666);//泛型指定了Integer类型，不能设置其他类型的参数
        System.out.println(man1.getWeiZhi());

        //MVP是自定义的泛型，是Object类型
//        man.show("Sting类型");
//        man.show(666);
//        man.show(0.12);

        //使用方法类的泛型，是Object类型
//        man.show1("Object类型");

        //使用静态的泛型，是Object类型
        man.show("静态");
        Man.show(666);

        System.out.println("-------------------------------------");

        //泛型的通配符<?>，？代表可以接收任意类型<?>接收任意的泛型
        //泛型不存在继承关系 ,如Collection<Object> list = new ArrayList<String>();这种是错误的

        //泛型的上限：
        //
        //格式：类型名称 <? extends 类 > 对象名称
        //意义：只能接收该类型及其子类
        //
        //泛型的下限：
        //
        //格式：类型名称 <? super 类 > 对象名称
        //意义：只能接收该类型及其父类型

        Collection<Integer> list1 = new ArrayList<Integer>();//儿子,是Number的儿子
        Collection<String> list2 = new ArrayList<String>();//兄弟
        Collection<Number> list3 = new ArrayList<Number>();//兄弟
        Collection<Object> list4 = new ArrayList<Object>();//爹

        getElement(list1);
//        getElement(list2);//报错
        getElement(list3);
//        getElement(list4);//报错

//        getElement2(list1);//报错
//        getElement2(list2);//报错
        getElement2(list3);
        getElement2(list4);

    }

    //泛型的上限：此时的泛型?，必须是Number类型或者Number类型的子类
    //记忆下面两个,能够理解泛型上下限
    //? extends Number,代表的是Number类及其子类,上限
    //? super Number,代表的是Number类及其父类,下限
    public static void getElement(Collection<? extends Number> coll){
        System.out.println(coll);
    }
    // 泛型的下限：此时的泛型?，必须是Number类型或者Number类型的父类
    public static void getElement2(Collection<? super Number> coll){
        System.out.println(coll);
    }

}

class Man<WeiZhi> {

    private WeiZhi weiZhi;

    public WeiZhi getWeiZhi() {
        return weiZhi;
    }

    public void setWeiZhi(WeiZhi weiZhi) {
        this.weiZhi = weiZhi;
    }

    //自定义的泛型
//    public <MVP> void show(MVP mvp) {
//        System.out.println(mvp);
//    }

    //使用方法类的泛型
//    public void show1(WeiZhi mvp){
//        System.out.println(mvp);
//    }

    //静态方法的泛型
    public static <WeiZhi> void show(WeiZhi mvp){
        System.out.println(mvp);
    }

}
